package main

import (
	"context"
	"fmt"
)

// 定义自定义类型作为 context key
type userKey string

const userKeyName userKey = "user"
const userInfoName userKey = "userInfo"

type UserInfo struct {
	ID   int
	Name string
}

func main() {
	ctx := context.Background()
	// 使用自定义类型作为键
	ctx = context.WithValue(ctx, userKeyName, "admin")
	GetUser(ctx)

	ctx = context.WithValue(ctx, userInfoName, UserInfo{
		ID:   1,
		Name: "admin",
	})
	GetUser(ctx)

}

func GetUser(ctx context.Context) {
	// ...
	// 使用自定义类型作为键获取值
	user := ctx.Value(userKeyName)
	fmt.Println(user)

	userInfo, ok := ctx.Value(userInfoName).(UserInfo)
	fmt.Println("ok: ", ok)
	if ok {
		fmt.Println(userInfo, userInfo.ID, userInfo.Name)
	}
}
